#include <vector>
#include <iostream>
#include <algorithm>
#include <ranges> // 视图定义于此
namespace rg = std::ranges;
using namespace std;

int main()
{
    std::vector a{4, 1, 6, 2};
    rg::sort(a.rbegin(), a.rend());
    for (auto i : a)
    {
        cout << i << " ";
    }
    cout << "------------------" << endl;
    // 这种写法等价上面
    // reverse_view 可以将一个范围“反转”，即让 begin 指向末尾元素，end 指向首元素的上一空位

    auto info{rg::reverse_view{a}};
    rg::sort(info);
    for (auto i : a)
    {
        std::cout << i << ' ';
    }
    cout << "------------------" << endl;
    // 这种写法等价上面
    // 标准库定义了一系列重载了 operator| 的对象
    rg::sort(a | std::views::reverse);
    for (auto i : a)
    {
        std::cout << i << ' ';
    }

    cout << "------------------" << endl;
    // 这种写法只比较前3个
    // rg::sort(rg::take_view{a, 3});
    rg::sort(a | std::views::take(3));
    for (auto i : a)
    {
        std::cout << i << ' ';
    }
    cout << "------------------" << endl;
    // 类似管道操作符，可以串起来
    rg::sort(a | std::views::take(3) | std::views::reverse);
    for (auto i : a)
    {
        std::cout << i << ' ';
    }
    return 0;
}
